// 速记内容还原
/**
 * 
速记内容还原:
有一种速记方式，针对重复内容有一套独特的缩写规则:重复的部分会被以"(重复内容)<重复次数>"形式记录，并且可能存在嵌套缩写关系。不重复的部分按照原样记录。现给一个符合此速记方式的字符串 records，请以字符串形式返回复原后的内容。注: records 仅由小写字母、数字及<,>,(,)组成。
输入:records="abc(d)<2>e"输出:"abcdde"解释:字符串中出现"(d)<2>"，表示"d"重复出现 2 次，因此返回复原后的内容"abcdde"。
输入:records="a(b,(c)<3>,d)<2>e"输出:"abcccdbcccde解释:字符串中出现"a(b(c)<3>d)<2>"，其中"(c)<3>"表示"c"出现3 次，复原为"ccc":"(bcccd)<2>" 表示"bcccd"重复出现 2 次，复原为"bcccdbcccd"。最终返回复原后内容"abcccdbcccde”
 * 
 */

function decodeString(records) {
    let queue = []; // 用于存储解析过程中的字符串和重复次数
    let currentStr = ''; // 当前正在构建的字符串
    let multiplier = ''; // 当前字符串的重复次数
    let repeatCount = 0;
    let status = 'str'; // str 字符串模式 repeat 重复字符串模式 num 记录重复字符串次数模式

    for (let char of records) {
        if ((char >= 'a' && char <= 'z') || (char >= '0' && char <= '9')) {
            if (status != 'num') {
                // 如果是小写字母或数字，直接添加到当前字符串
                currentStr += char;
                status = 'str';
            } else {
                multiplier += char;
            }
        } else if (char === '(') {
            status = 'repeat';

            // 遇到左括号，将当前字符串和重复次数压入栈，并重置它们以处理新子串
            if (currentStr) {
                queue.push([currentStr, repeatCount]);
            }

            repeatCount++;
            currentStr = '';
            multiplier = '';
        } else if (char === ')') {
            let prevStr = '';
            if (queue[queue.length - 1][1] === repeatCount) {
                prevStr = queue.pop();
            }

            if (prevStr) {
                currentStr = prevStr[0] + currentStr;
            }

            repeatCount--;
        } else if (char === '<') {
            // 遇到 '<'，表示接下来的数字是重复次数
            status = 'num';
            multiplier = '';
        } else if (char === '>') {
            // 遇到 '>'，表示重复次数结束
            let prevStr = queue.pop();
            if (multiplier != '') {
                currentStr = currentStr.repeat(parseInt(multiplier));
            }

            if (prevStr) {
                currentStr = prevStr[0] + currentStr;
            }
            queue.push([currentStr, repeatCount]);

            multiplier = '';
            currentStr = '';

            if (repeatCount > 0) {
                status = 'repeat';
            } else {
                status = 'str';
            }
        } else if (char === ',') {
            // 代表repeat模式中有多个数组，需要进行合并
            // 同时，此时需要观察外部queue中的元素是否属于repeat,如果不属于，那不能合并进来

            let prevStr = '';
            if (queue[queue.length - 1][1] === repeatCount) {
                prevStr = queue.pop();
            }

            if (prevStr) {
                currentStr = prevStr[0] + currentStr;
            }
            queue.push([currentStr, repeatCount]);

            multiplier = '';
            currentStr = '';
        }
    }

    if (queue.length >= 1) {
        currentStr = queue.pop()[0] + currentStr;
    }

    // console.log(currentStr);
    return currentStr;
}

// 测试样例
console.log(decodeString('abc(d)<2>e')); // 输出: "abcdde"
console.log(decodeString('a(b,(c)<3>,d)<2>e')); // 输出: "abcccdbcccde"
